#include "ModRunComposite.h"
#include <QDebug>

#include "../Output/FactoryOutput.h"

#include "Gof23/Gof_Composite/LeafComponent.h"
#include "Gof23/Gof_Composite/CompositeComponent.h"

//组合模式ModRun（Composite）;
ModRunComposite::ModRunComposite()
{
    //模式名称;
    m_strModelName = "组合模式（Composite）;";
    //模式描述;
    m_strModelDesc = "组合模式：将对象组合成树形结构以表示“部分-整体”的层次结构，组合模式使得客户端对单个对象和组合对象的使用具有一直性。\n"
        "既然讲到以树形结构表示“部分 - 整体”，那可以将组合模式想象成一根大树，将大树分成树枝和树叶两部分，\n"
        "树枝上可以再长树枝，也可以长树叶，树叶上则不能再长出别的东西。\n\n"
        "以下情况可以考虑使用组合模式：\n"
        "希望表示对象的部分 - 整体层次结构。\n"
        "希望客户端忽略组合对象与单个对象的不同，客户端将统一的使用组合结构中的所有对象。\n"
                     ;
}

//初始化显示模式;
void ModRunComposite::InitDisplay()
{
    qDebug() << m_strModelName;
    std::shared_ptr<IOutput> pOutPut = FactoryOutput::GetInstance()->CreateDescOutput();
    if (pOutPut)
    {
        std::initializer_list<QString> outList{ m_strModelName,m_strModelDesc};
        pOutPut->OutPut(outList);
    }
}

//返回模式类型;
EnumModRun ModRunComposite::GetEnum()
{
    return emModRunComposite;
}

//运行模式;
void ModRunComposite::ModRun()
{
    std::shared_ptr<IOutput> pOutPut = FactoryOutput::GetInstance()->CreateRunOutput();
    if (pOutPut)
    {
        std::initializer_list<QString> outListStart{ "========组合模式 start:=======" };
        std::initializer_list<QString> outListEnd{ "========组合模式 end:=======" };
        pOutPut->OutPut(outListStart);

        //组合模式;
        std::shared_ptr<CompositeComponent> comCompRoot(new CompositeComponent("Root"));
        std::shared_ptr<CompositeComponent> comComp1(new CompositeComponent("Site1"));
        std::shared_ptr<CompositeComponent> comComp2(new CompositeComponent("Site2"));
        std::shared_ptr<LeafComponent> comLeaf1(new LeafComponent("Leaf1"));
        std::shared_ptr<LeafComponent> comLeaf2(new LeafComponent("Leaf2"));
        std::shared_ptr<LeafComponent> comLeaf3(new LeafComponent("Leaf3"));

        comCompRoot->Add(comComp1);
        comCompRoot->Add(comComp2);
        comComp1->Add(comLeaf1);
        comComp2->Add(comLeaf2);
        comComp2->Add(comLeaf3);

        comCompRoot->operation();

        //移除"Leaf3"
        comComp2->Remove(comLeaf3);

        //重新打印;
        comCompRoot->operation();

        pOutPut->OutPut(outListEnd);
    }

}

InterFaceModRun* ModRunComposite::CreateMe()
{
    return new ModRunComposite();
}
